<?php

class AIngresoProduccion {

    public function __construc() {
    }
    
    public function actualizarOrdenProduccion (&$facade) {

    	$session = & $facade->getSession();
    	$null = NULL;

		$session->evictAll('MTransSet');
		$session->evictAll('MWorkTrans');
		$session->evictAll('DOrdenTrabajo');
		$session->evictAll('MWorkflow');
		$session->evictAll('MWorkPlace');

    	$ingreso = & $facade->getDocumentRoot();
    	$orden = & $ingreso->getAsociadoA();
    	$workflowIngreso = & $ingreso->getWorkflowRef();
    	$workflowOrden   = & $orden->getWorkflowRef();

    	$newEfacade = & EFacade :: initWorkflowWithoutRole($session, $orden,  MTrans :: $TYPE_AUTO_PROCESS);
    	$transSetOP = & $newEfacade->getTransSet();
		$transOP = & $transSetOP->getTransByName('t11');
		$newEfacade->fireTrans($transOP, $null, "finalizada la orden de Producci&oacute;n", TRUE);
		$workflowOrden->epSetDirty(TRUE);
		$orden->epSetDirty(TRUE);
		
		$transSetIM = & EFacade :: getCurrentTransSetAuto($workflowIngreso, MTrans :: $TYPE_AUTO_AGENT);
		$session->evictAll('MTransSet');
		$transIM = $transSetIM->getTransByName('t3');
		$facade->fireTrans($transIM, $null, 'Mercanc&iacute;a Enviada', FALSE);

    }
    
    public function actualizarSolicitudes (&$facade) {
    	$session = & $facade->getSession();
    	$null = NULL;

    	$ingreso = & $facade->getDocumentRoot();
    	$orden = & $ingreso->getAsociadoA();
    	$workflowIngreso = & $ingreso->getWorkflowRef();
    	$workflowOrden   = & $orden->getWorkflowRef();
    	
    	$cantidadIngreso=$ingreso->asociadoA->requerimientoOriginal->cantidad;

		$almacen=$ingreso->almacen;
			
		$orden = & $ingreso->getAsociadoA();	
	
		$cantidadIngreso=$ingreso->asociadoA->requerimientoOriginal->cantidad;

		$almacen=$ingreso->almacen;
		
		//ingresar los items
		//echo "<hr><hr>",$ingreso;
		$listaItemsIM = & $ingreso->listaItems;
		$productos=array();
		
		//cantidad entregada del producto total del ingreso de mercancia desde produccion
		$cantidadTotalEntregada=0;
		foreach ($listaItemsIM as & $ii) {
			//echo "<br><br><br>",$ii;
			
			
			$productoAlmacenado = $session->create('MProductoAlmacenado');
			$productoAlmacenado->setAlmacenadoEn($ingreso->getAlmacen());
			$productoAlmacenado->setCantidad($ii->getCantidadEnviada());
			$productoAlmacenado->setEspecificaInstancia($ii->getItemIngresado());
			$productoAlmacenado->setFechaDeLlegada(time());
			//
			//
			$productoAlmacenado->commit();
			
			//
			//
			//
			$productos[]=$productoAlmacenado;		
			
			//echo "<br><br>el producto almacenado es: ",$productoAlmacenado;
		}
		
		// -----------------------------
		// asignar el despacho para el cliente
		// -----------------------
		
    	if($listaCotizaciones=$orden->requerimientoOriginal->asociadoACotizacion){
    		
    		$listaItems=array();
    		$asignacionesTotales=array();// para tener en cuenta cuales productos han sido asignados y en que cantidad;
    		foreach($listaCotizaciones as & $lista){
    			//echo "<hr>lista : ",$lista;
    			//echo "<hr>lista cotizacion: ",$lista->cotizacion;
    			/*
    			 * para cada cotizacion hacer una orden para despachar al cliente
    			 */
    			$docRoot=$facade->session->create('DOrdenDespachoCotizacion'); 
    			$docRoot->cliente=$lista->cotizacion->solicitante;
    			$cantidadRestante=$lista->getCantidad();
    			$docRoot->asociadoA=$lista->cotizacion;
    			//echo "<br>la cantidad restante es: ",$cantidadRestante;
    			$hayBreak=FALSE;
    			foreach ($productos as & $producto){
    				/*
    				 * reviso si el producto fue asignado anteriormente
    				 */
    				foreach($asignacionesTotales as $asignacion){
    					if($asignacion->de->epGetUid() == $producto->epGetUid()){
    						$salir=TRUE;
    						break;
    					}
    					else{
    						$salir=FALSE;
    					}
    				}
    				if($salir)
    					continue; // salirse del foreach para buscar otro producto que no este asignado
    				//echo "<hr>if cantidad restante (".$cantidadRestante.") >= productoCantidad (".$producto->cantidad.")";
    				if($cantidadRestante >= $producto->getCantidad()){
    					$cantidad=$producto->getCantidad();
    					$cantidadRestante-=$cantidad;
    				}
    				else{
    					$cantidad=$cantidadRestante;
    					$hayBreak=TRUE;
    				}
    				//echo "<hr>la cantidad final es: ",$cantidad;
    				$listaDespacho=$facade->session->create('MListaDespacho');
					$listaDespacho->producto=$producto;
					$listaDespacho->cantidad=$cantidad;
					$listaDespachos[]=$listaDespacho;
					$listaDespacho->commit();
					$date=mktime(date('m'),date('d'),date('Y'));
					
					$asignacionProducto = $facade->session->create('MAsignacionProducto');
	    			
	    			$asignacionProducto = $session->create('MAsignacionProducto');
	    			$asignacionProducto->cantidad = $cantidad;
	    			$asignacionProducto->fechaDeAsignacion = $date;
	    			$asignacionProducto->de = $producto;
	    			$asignacionProducto->listaDespachoVenta = $listaDespacho;
					$asignacionProducto->commit();
					
					//echo "<br><br>la asignacion es: ",$asignacionProducto;
					
					$asignaciones[]=$asignacionProducto;
					$asignacionesTotales[]=$asignacionProducto;
					
					$facade->session->evictAll('MProducto');
					$facade->session->evictAll('MInstanciaProducto');
					//$facade->session->evictAll('MProductoAlmacenado');
					$facade->session->evictAll('MAsignacionProducto');

//					$ezpdo_->evictAll('MProducto');
//					$ezpdo_->evictAll('MInstanciaProducto');
//					//$facade->session->evictAll('MProductoAlmacenado');
//					$ezpdo_->evictAll('MAsignacionProducto');
    				//echo "la cantidad restante es: ",$cantidadRestante;
    				if($hayBreak)
    					break; // ya se asociaron todos los productos a la orden en las cantidades necesarias
    						   // por lo que se sale del foreach de productos;	
    			}
    			$docRoot->listaDespachos=$listaDespachos;
    			$docRoot->productosAsignados=$asignaciones;
				
				
				$role=NULL;
				
				$newEfacade =& EFacade :: initWorkflow($facade->session, $docRoot, & $role);
				//echo "<br>Inicia el wf de orden de actividad";
				//echo "la orden de actividad tiene asociada :",$docRoot->ordenOriginal;
				$transSetOD = & EFacade :: getCurrentTransSetAuto($newEfacade->getWorkflow(), /* MTrans :: $TYPE_AUTO_PROCESS */ 3);
				//echo "newefacde de OA es: ",$newEfacade;
				//echo "<br>el transsetOT es: ",$transSetOT;
				$transOD = $transSetOD->getTransByName('t1');
				//echo "<br>transOA",$transOD;
				$usuario=NULL;
				$newEfacade->fireTrans($transOD, $usuario, "Crear",TRUE);
				//echo "<br><br>EL DOCROOT ES: ",$docRoot;
				$docRoot->epSetDirty(TRUE);// marcar el documento para que sea salvado los cambios en su lista de items
				$newEfacade->saveWorkflow();
				$docRoot->commit();
				$docRoot->numero = $docRoot->getDocumentNumber();
				$docRoot->diferenciador = $docRoot->getDocumentDifer();
				$docRoot->commit();
				unset($newEfacade);
				$facade->session->evictAll('MEdge');
				$facade->session->evictAll('MTrans');
				$facade->session->evictAll('MPlace');
//				echo "<hr>el doc es ",$docRoot;
//				echo "<hr><hr><hr><hr>";
    		}
    			
    	}	
//		
//		
//		
//		echo "<br>la orden es: ",$requerimiento=$orden->requerimientoOriginal;
//		
//		$solicitudesCotizacion=$requerimiento->asociadoACotizacion;
//		
//		foreach($solicitudesCotizacion as $solicitud){
//			echo "la cotizacion es: ",$cotizacion=$solicitud->cotizacion;
//			//$cantidad=$cotizacion;
//			
//			//////////////////////////////////
//    			/*
//    			 * CREACION
//    			 * DE ORDEN DE
//    			 * DESPACHO POR COTIZACION
//    			 */
//    		
//	    		//echo "<br>el facade es OP: ",$facade;
//				//echo "<br>entra en eque hay orden de trabajo";
//				$docRoot = $facade->session->create('DOrdenDespachoCotizacion');
//				//echo "la orden de produccion es: ",$docOP;
//				//echo "<br>doc_ordenProduccion: ",$docRoot;
//				$docRoot->asociadoA=$cotizacion;
//				
//				$docRoot->equiposAsignados=$ocupacionEquipo;
//				$docRoot->personalAsignado=$asignacionPersona;
//				//echo "<br>el docRoot es:",$docRoot;
//				//echo "<br>asigna a la orden de actividad la orden de produccion";
//				//echo "<br>luego de colocar asociado a",$docRoot;
//				/** para crear el workflow por primera vez **/
//				
//				$newEfacade =& EFacade :: initWorkflow($facade->session, $docRoot, & $role);
//				//echo "<br>Inicia el wf de orden de actividad";
//				//echo "la orden de actividad tiene asociada :",$docRoot->ordenOriginal;
//				$transSetOT = & EFacade :: getCurrentTransSetAuto($newEfacade->getWorkflow(), /* MTrans :: $TYPE_AUTO_PROCESS */ 3);
//				//echo "newefacde de OA es: ",$newEfacade;
//				//echo "<br>el transsetOT es: ",$transSetOT;
//				$transOT = $transSetOT->getTransByName('t1');
//				//echo "<br>transOA",$transOT;
//				$usuario=NULL;
//				$newEfacade->fireTrans($transOT, $usuario, "Crear",TRUE);
//				//echo "<br><br>EL DOCROOT ES: ",$docRoot;
//				$docRoot->epSetDirty(TRUE);// marcar el documento para que sea salvado los cambios en su lista de items
//				$newEfacade->saveWorkflow();
//				$docRoot->commit();
//				$docRoot->numero = $docRoot->getDocumentNumber();
//				unset($newEfacade);
//				$facade->session->evictAll('MEdge');
//				$facade->session->evictAll('MTrans');
//				$facade->session->evictAll('MPlace');
//    	
//				
//		}
		
		
		/////////////////////////////////
		
    	
		
		$transSetIM = & EFacade :: getCurrentTransSetAuto($workflowIngreso, MTrans :: $TYPE_AUTO_AGENT);
		$session->evictAll('MTransSet');
		$transIM = $transSetIM->getTransByName('t5');
		$facade->fireTrans($transIM, $null, 'Mercanc&iacute;a Recibida', FALSE);
    }
}
?>